// 基于axios封装网络请求
import theAxios from 'axios'
import router from '@/router/index.js'
import { Notify } from 'vant'
import { getToken, removeToken } from '@/utils/token.js'// setToken
// import { refreshTokenAPI } from '@/api/index.js'
const axios = theAxios.create({
  baseURL: 'http://toutiao.itheima.net',
  timeout: 20000
})

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // ?. 可选链操作符，如果前面的对象中里没有length，整个表达式原地返回undefined
  // 如果getToken()在原地有值token字符串，才能调用length获取疮毒
  if (getToken() && getToken().length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
// 本质就是一个函数
axios.interceptors.response.use(function (response) {
  // http状态码为2xx,3xx进入这里
  // 对响应数据做点什么
  return response
}, async function (error) {
  // http状态码为4xx,5xx报错进入这里
  // 对响应错误做点什么
  console.log(error)
  if (error.response.status === 401) {
    // 不能使用this.$router，因为不是vue实例
    Notify({ type: 'warning', message: '身份已过期' })

    // 方式1
    removeToken()
    router.replace(`/login?path=${router.currentRoute.fullPath}`)
  }

  // 方式2
  //   const res = await refreshTokenAPI()
  //   // 1.更新token在本地
  //   setToken(res.data.data.token)
  //   // 2.更新新的token在请求头里
  //   error.config.headers.Authorization = `Bearer ${res.data.data.token}`
  //   // 3.未完成的请求再次发起
  //   return axios(error.config)
  // } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') {
  //   // 刷新的token也过期了
  //   removeToken()
  //   localStorage.clear() // 清楚所有的值
  //   router.replace('/login')
  // }
  return Promise.reject(error)
})

export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return axios({
    url,
    method,
    params,
    data,
    headers
  })
}
